<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>16. Fehlerbehandlung &mdash; PowerShell fuer Systemintegratoren</title>
    
    <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    './',
        VERSION:     '1.0',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="_static/jquery.js"></script>
    <script type="text/javascript" src="_static/underscore.js"></script>
    <script type="text/javascript" src="_static/doctools.js"></script>
    <script type="text/javascript" src="_static/translations.js"></script>
    <link rel="top" title="PowerShell fuer Systemintegratoren" href="index.html" />
    <link rel="next" title="17. Anhang" href="powershell_anhang_1.html" />
    <link rel="prev" title="15. UML" href="powershell_uml.html" /> 
  </head>
  <body>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="Allgemeiner Index"
             accesskey="I">Index</a></li>
        <li class="right" >
          <a href="powershell_anhang_1.html" title="17. Anhang"
             accesskey="N">weiter</a> |</li>
        <li class="right" >
          <a href="powershell_uml.html" title="15. UML"
             accesskey="P">zurück</a> |</li>
        <li><a href="index.html">PS4SYS</a> &raquo;</li> 
      </ul>
    </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
            <p class="logo"><a href="index.html">
              <img class="logo" src="_static/PowerShell_icon_small.png" alt="Logo"/>
            </a></p>
  <h3><a href="index.html">Inhalt</a></h3>
  <ul>
<li><a class="reference internal" href="#">16. Fehlerbehandlung</a><ul>
<li><a class="reference internal" href="#what-if">16.1. What-if</a></li>
<li><a class="reference internal" href="#confirm">16.2. Confirm</a></li>
<li><a class="reference internal" href="#erroraction">16.3. ErrorAction</a></li>
<li><a class="reference internal" href="#erkennen-und-behandeln-von-fehlern">16.4. Erkennen und Behandeln von Fehlern</a></li>
<li><a class="reference internal" href="#error-status-in">16.5. Error Status in $?</a></li>
<li><a class="reference internal" href="#benutzen-von-traps">16.6. Benutzen von Traps</a></li>
<li><a class="reference internal" href="#try-catch-finally">16.7. Try - catch -finally</a></li>
<li><a class="reference internal" href="#catching-errors-in-functions-and-scripts">16.8. Catching Errors in Functions and Scripts</a></li>
</ul>
</li>
</ul>

  <h4>Vorheriges Thema</h4>
  <p class="topless"><a href="powershell_uml.html"
                        title="vorheriges Kapitel">15. UML</a></p>
  <h4>Nächstes Thema</h4>
  <p class="topless"><a href="powershell_anhang_1.html"
                        title="nächstes Kapitel">17. Anhang</a></p>
  <h3>Diese Seite</h3>
  <ul class="this-page-menu">
    <li><a href="_sources/powershell_fehlerbehandlung.txt"
           rel="nofollow">Quelltext anzeigen</a></li>
  </ul>
<div id="searchbox" style="display: none">
  <h3>Schnellsuche</h3>
    <form class="search" action="search.html" method="get">
      <input type="text" name="q" />
      <input type="submit" value="Los" />
      <input type="hidden" name="check_keywords" value="yes" />
      <input type="hidden" name="area" value="default" />
    </form>
    <p class="searchtip" style="font-size: 90%">
    Geben Sie Suchbegriffe oder einen Modul-, Klassen- oder Funktionsnamen ein.
    </p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
            
  <div class="section" id="fehlerbehandlung">
<span id="index-0"></span><h1>16. Fehlerbehandlung<a class="headerlink" href="#fehlerbehandlung" title="Permalink zu dieser Überschrift">¶</a></h1>
<p>Je größer Skripts werden, desto größer ist die Wahrscheinlichkeit, dass sich Fehler in den Code einschleichen.</p>
<div class="section" id="what-if">
<span id="index-1"></span><h2>16.1. What-if<a class="headerlink" href="#what-if" title="Permalink zu dieser Überschrift">¶</a></h2>
<p>Um zu sehen, welche Effekte ein Skript hat, kann man es mit dem sog. What-if-Paramter versehen.</p>
<div class="highlight-sh"><div class="highlight"><pre><span class="c"># What exactly would happen if Stop-Process</span>
<span class="c"># ended all processes beginning with &quot;c&quot;?</span>
Stop-Process -Name c* -WhatIf

PS C:<span class="se">\&gt;</span> Stop-Process -Name c* -WhatIf
WhatIf: Ausführen des Vorgangs <span class="s2">&quot;Stop-Process&quot;</span> für das Ziel <span class="s2">&quot;conhost (1012)&quot;</span>.
WhatIf: Ausführen des Vorgangs <span class="s2">&quot;Stop-Process&quot;</span> für das Ziel <span class="s2">&quot;conhost (2000)&quot;</span>.
WhatIf: Ausführen des Vorgangs <span class="s2">&quot;Stop-Process&quot;</span> für das Ziel <span class="s2">&quot;csrss (368)&quot;</span>.
WhatIf: Ausführen des Vorgangs <span class="s2">&quot;Stop-Process&quot;</span> für das Ziel <span class="s2">&quot;csrss (428)&quot;</span>.
</pre></div>
</div>
<p>What-IF kann auch in eigene Funktionen integriert werden.</p>
<div class="highlight-sh"><pre>function MapDrive([string]$driveletter, [string]$target, [switch]$whatif)
{
        If ($whatif)
        {
                Write-Host "WhatIf: creation of a network drive " +
                "with the letter ${driveletter}: at destination $target"
        }
        Else
        {
                New-PSDrive $driveletter FileSystem $target
        }
}

MapDrive k \\127.0.0.1\C$ -whatif
WhatIf: creation of a network drive  + with the letter k: at destination \\127.0.0.1\C$</pre>
</div>
</div>
<div class="section" id="confirm">
<span id="index-2"></span><h2>16.2. Confirm<a class="headerlink" href="#confirm" title="Permalink zu dieser Überschrift">¶</a></h2>
<p>Mit Hilfe des -confirm - Parameters wird vor der Ausführung eines Befehls eine Sicherheitsabfrage formuliert.</p>
<div class="highlight-sh"><div class="highlight"><pre>Stop-Service a* -Confirm

Bestätigung
Möchten Sie diese Aktion wirklich ausführen?
Ausführen des Vorgangs <span class="s2">&quot;Stop-Service&quot;</span> für das Ziel <span class="s2">&quot;Anwendungserfahrung</span>
<span class="s2">(AeLookupSvc)&quot;</span>.
<span class="o">[</span>J<span class="o">]</span> Ja  <span class="o">[</span>A<span class="o">]</span> Ja, alle  <span class="o">[</span>N<span class="o">]</span> Nein  <span class="o">[</span>K<span class="o">]</span> Nein, keine  <span class="o">[</span>H<span class="o">]</span> Anhalten  <span class="o">[</span>?<span class="o">]</span> Hilfe
<span class="o">(</span>Standard ist <span class="s2">&quot;J&quot;</span><span class="o">)</span>:n

Bestätigung
Möchten Sie diese Aktion wirklich ausführen?
Ausführen des Vorgangs <span class="s2">&quot;Stop-Service&quot;</span> für das Ziel <span class="s2">&quot;Gatewaydienst auf</span>
<span class="s2">Anwendungsebene (ALG)&quot;</span>.
<span class="o">[</span>J<span class="o">]</span> Ja  <span class="o">[</span>A<span class="o">]</span> Ja, alle  <span class="o">[</span>N<span class="o">]</span> Nein  <span class="o">[</span>K<span class="o">]</span> Nein, keine  <span class="o">[</span>H<span class="o">]</span> Anhalten  <span class="o">[</span>?<span class="o">]</span> Hilfe
<span class="o">(</span>Standard ist <span class="s2">&quot;J&quot;</span><span class="o">)</span>:
</pre></div>
</div>
<p>Da manche Befehle &#8220;kritischer&#8221; als andere Befehle sind, haben die Schöpfer der <strong>Powershell</strong> verschiedene Confirm-Level (Low, Medium, High, None) eingebaut und diese an bestimmte Befehle gebunden. So würde die Bestätigungsabfrage beim Löschen einer User-Mail per exchange-cmdlet auch dann eine Sicherheitsabfrage hervorrufen, wenn der -confirm - Parameter nicht übergeben wird. Dies kann über die Variable $ConfirmPreference gesteuert werden. Wenn diese auf &#8220;Low&#8221; gesetzt wird, wird immer einer Bestätigung verlangt, bei &#8220;None&#8221; findet keine bestätigung statt.</p>
<div class="highlight-sh" id="index-3"><div class="highlight"><pre>Calculator may be started and stopped without being called
<span class="c"># into question because Stop-Process is in the Medium category:</span>
Calc
Stop-Process -Name calc
<span class="c"># If the default setting is changed from High to Low,</span>
<span class="c"># PowerShell will automatically question every action:</span>
<span class="nv">$ConfirmPreference</span> <span class="o">=</span> <span class="s2">&quot;Low&quot;</span>
calc
Stop-Process -Name calc
</pre></div>
</div>
</div>
<div class="section" id="erroraction">
<h2>16.3. ErrorAction<a class="headerlink" href="#erroraction" title="Permalink zu dieser Überschrift">¶</a></h2>
<p>Auf einen Fehler kann Powershell mit verschiedenen Verhaltensweisen reagieren.</p>
<ul class="simple">
<li>SilentlyContinue: Einfach weitermachen</li>
<li>Continue: Fehlermeldung anzeigen aber weitermachen</li>
<li>Stop: Ausführung des Skriptes anhalten</li>
<li>Inquire: Nachfragen, wie es sich verhalten soll.</li>
</ul>
<p>Das Verhaltensweisen können mit Hilfe des Parameter <em>-ErrorAction</em> bzw. der globalen Variable <em>$ErrorActionPreference</em> gesteuert werden.</p>
<div class="highlight-sh"><div class="highlight"><pre>Del <span class="s2">&quot;nosuchthing&quot;</span>; Write-Host <span class="s2">&quot;Done!&quot;</span>

Del <span class="s2">&quot;nosuchthing&quot;</span> -ErrorAction <span class="s2">&quot;SilentlyContinue&quot;</span>; Write-Host <span class="s2">&quot;Done!&quot;</span>

<span class="nv">$script</span>:ErrorActionPreference <span class="o">=</span> <span class="s2">&quot;Stop&quot;</span>  <span class="c">#globales Anhalten bei Fehlern</span>
</pre></div>
</div>
</div>
<div class="section" id="erkennen-und-behandeln-von-fehlern">
<h2>16.4. Erkennen und Behandeln von Fehlern<a class="headerlink" href="#erkennen-und-behandeln-von-fehlern" title="Permalink zu dieser Überschrift">¶</a></h2>
<p>Häufig will man auf Fehler auch reagieren können. Eine Möglichkeit ist es, den Fehlerstatus eines Programms auszuwerten. Dieser kann über die globale Variable <strong>$?</strong> abgefragt werden. Wenn ein Fehler aufgetreten ist, hat diese Variable den Wert <strong>True</strong>.</p>
<div class="highlight-sh"><div class="highlight"><pre>Del <span class="s2">&quot;nosuchthing&quot;</span> -ErrorAction <span class="s2">&quot;SilentlyContinue&quot;</span>
If <span class="o">(</span>!<span class="nv">$?</span><span class="o">)</span> <span class="o">{</span> <span class="s2">&quot;Didn&#39;t work!&quot;</span>; <span class="nb">break</span> <span class="o">}</span>; <span class="s2">&quot;Everything&#39;s okay!&quot;</span>

Del <span class="s2">&quot;nosuchthing&quot;</span> -ErrorAction <span class="s2">&quot;SilentlyContinue&quot;</span>
If <span class="o">(</span>!<span class="nv">$?</span><span class="o">)</span> <span class="o">{</span> <span class="s2">&quot;Error: $($error[0])&quot;</span>; <span class="nb">break</span> <span class="o">}</span>; <span class="s2">&quot;Everything&#39;s okay!&quot;</span>
Error: Cannot find path <span class="s2">&quot;u:\nosuchthing&quot;</span> because it does not exist.
</pre></div>
</div>
</div>
<div class="section" id="error-status-in">
<h2>16.5. Error Status in $?<a class="headerlink" href="#error-status-in" title="Permalink zu dieser Überschrift">¶</a></h2>
</div>
<div class="section" id="benutzen-von-traps">
<h2>16.6. Benutzen von Traps<a class="headerlink" href="#benutzen-von-traps" title="Permalink zu dieser Überschrift">¶</a></h2>
<ul class="simple">
<li>Traps Require Unhandled Exceptions</li>
<li>Using Break and Continue to Determine What Happens after an Error</li>
<li>Finding Out Error Details</li>
<li>Error Records: Error Details</li>
<li>Error Record by Redirection</li>
<li>Table 11.3: Properties of an error record</li>
<li>Error Record(s) Through the -ErrorVariable Parameter</li>
<li>Error Records Through $Error</li>
<li>Error Record Through Traps</li>
</ul>
</div>
<div class="section" id="try-catch-finally">
<h2>16.7. Try - catch -finally<a class="headerlink" href="#try-catch-finally" title="Permalink zu dieser Überschrift">¶</a></h2>
<p><a class="reference external" href="http://blogs.technet.com/b/heyscriptingguy/archive/2010/03/11/hey-scripting-guy-march-11-2010.aspx">http://blogs.technet.com/b/heyscriptingguy/archive/2010/03/11/hey-scripting-guy-march-11-2010.aspx</a></p>
<p>Exceptions verstehen ====================</p>
<p>Fehler werden in modernen Programmiersprachen häufig mit dem neutralen Wort <strong>Ausnahmen</strong> bezeichnet. Beim Auftreten eines Fehlers wird eine Ausnahme ausgelößt, die von einer Stelle im Quellcode behandelt werden muss; ansonsten kommt es letztlich zu einer roten Fehlermeldung auf der Konsole.</p>
<p>Ausnahmen sind letztlich spezielle Fehlerklassen des .NET-Frameworks; für bestimmte Fehler gibt es jeweils spezielle Fehlerklassen.</p>
<p>In Abhängigkeit von bestimmten Fehler kann ein Skript nun unterschiedlich reagieren. Dies wird mit Hilfe des <strong>try &#8211; catch &#8211; finally</strong> - Konstruktes möglich.</p>
</div>
<div class="section" id="catching-errors-in-functions-and-scripts">
<h2>16.8. Catching Errors in Functions and Scripts<a class="headerlink" href="#catching-errors-in-functions-and-scripts" title="Permalink zu dieser Überschrift">¶</a></h2>
<ul class="simple">
<li>Stepping Through Code: Breakpoints</li>
<li>Table 11.4: Settings for $DebugPreference</li>
<li>Table 11.5: Fine adjustments of the PowerShell console</li>
<li>Tracing: Displaying Executed Statements</li>
<li>Stepping: Executing Code Step-by-Step</li>
<li>Summary</li>
</ul>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="Allgemeiner Index"
             >Index</a></li>
        <li class="right" >
          <a href="powershell_anhang_1.html" title="17. Anhang"
             >weiter</a> |</li>
        <li class="right" >
          <a href="powershell_uml.html" title="15. UML"
             >zurück</a> |</li>
        <li><a href="index.html">PS4SYS</a> &raquo;</li> 
      </ul>
    </div>
    <div class="footer">
        &copy; Copyright 2010, STE.
      Mit <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1 erstellt.
    </div>
  </body>
</html>